#ifndef __NET_CHANNEL__
#define __NET_CHANNEL__

#include<iostream>
#include<functional>

#include<sys/epoll.h>

#include"../log/log.hpp"

class Eventloop;

class Channel
{
public:
    using EventCallback = std::function<void()>;

    typedef enum 
    {
        Read = 0 , Write , Error , Close , Every
    }CallBackState;

    typedef enum 
    {
        Be_Read = 0 , Be_Write , Able_Read , Able_Write , Disable_Read , Disable_Write , Disable_All
    }EventState;

public:
    Channel(Eventloop* loop, int fd);

    //获取channel对应的fd
    int get_fd();

    //获取想要监控的事件
    uint32_t get_events();

    //设置实际就绪的事件
    void set_revents(uint32_t events);

    //设置监听事件
    //分为检测当前是否监听可读、可写；设置可读、可写；取消可读、可写；取消全部监听
    bool set_events(EventState state);

    //设置channel对应的回调函数
    void set_callback(const EventCallback& cb,CallBackState state);

    // 移除监控
    void remove_channel();

    //事件处理，连接触发了事件就调用
    void handle_event();

private:
    int _fd;                       //当前连接的fd
    Eventloop* _loop;              //事件循环
    uint32_t _events;              //当前需要监控的事件
    uint32_t _revents;             //当前就绪的事件

    EventCallback _read_callback;  //可读事件被触发的回调函数
    EventCallback _write_callback; //可写事件被触发的回调函数
    EventCallback _error_callback; //错误事件被触发的回调函数
    EventCallback _close_callback; //连接断开事件被触发的回调函数
    EventCallback _every_callback; //任意事件被触发的回调函数
};

#endif